﻿/**
 * @file musicwidget.h
 * @author tjc
 * @brief 音乐播放器模块
 * @version 1.0
 * @date 2024-2-27
 */

#ifndef MUSICWIDGET_H
#define MUSICWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QListWidget>
#include <QTextEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QMediaPlayer> //播放器组件
#include <QMediaPlaylist>//播放器列表组件
#include <QFileInfo>
#include <QFileDialog>
#include <QTime>
#include "tcpserver.h"
#include "common.h"
#include "MusicSendThread.h"
class MusicWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MusicWidget(QWidget *parent = nullptr);
    QMediaPlayer *mPlayer = nullptr;//播放器
    QMediaPlaylist *mPlayList = nullptr;//播放器列表
    QString mDurationTime="00:00";//播放总时长
    QString mPositionTime = "00:00";//当前播放到的位置
    bool isPlay;//是否播放
    bool isExist;//存在音乐
    int lastHighlightedLine = -1;//记录上次高亮的歌词的行数
    //添加音乐按钮
    QPushButton *addButton;
    //删除音乐按钮
    QPushButton *removeButton;
    //显示音乐的列表
    QListWidget *songListWidget;
    //显示歌词的文本域
    QTextEdit *lyricsEdit;
    //显示播放时间
    QLabel *timeLabel;
    //播放进度条滑块
    QSlider *timeSlider;
    //声音滑块
    QSlider *soundSlider;
    //声音标签
    QLabel *soundLabel;
    //声音大小标签
    QLabel *soundSizeLabel;
    //上一首按钮
    QPushButton *prevButton;
    //播放按钮
    QPushButton *playButton;
    //下一首按钮
    QPushButton *nextButton;
    //FuTcpServer
    FuTcpServer *fuTcpServer;
    //存放当前歌曲歌词的列表
    QList<QPair<QTime, QString>> currentLrics;
    //MusicSendthread
    MusicSendThread *musicSendthread=nullptr;
    //获取指定歌曲的歌词
    QList<QPair<QTime, QString>> parseLrcFile(const QString
                                              &lrcFilePath);
    void scrollLyricsToCenter(int line);
    //加载当前音乐歌词到 QTextEdit 中
    void loadMusicLrc(int index);
    //根据播放进度更新歌词
    void updateLrcOfposition(qint64 position);
    //音乐窗口的初始化
    void initMusicWidget();
    //回复播放暂停音乐指令的处理逻辑
    void playMusicAfter(const QByteArray &ack);
    //回复上一首音乐指令的处理逻辑
    void prevMusicAfter(const QByteArray &ack);
    //回复下一首音乐指令的处理逻辑
    void nextMusicAfter(const QByteArray &ack);
public slots:
    //播放列表音乐切换的槽函数
    void slot_playlistChanged(int rowNo);
    //播放文件切换的槽函数
    void slot_durationChanged(qint64 duration);
    //播放位置切换的槽函数
    void slot_positionChanged(qint64 position);
    //添加音乐槽函数
    void slot_addMusic();
    //删除音乐槽函数
    void slot_removeMusic();
    //播放暂停音乐槽函数,发送控制指令
    void slot_playMusic();
    //上一首槽函数,发送控制指令
    void slot_prevMusic();
    //下一首槽函数,发送控制指令
    void slot_nextMusic();
    //声音大小槽函数
    void slot_changeSound(int value);
    // 双击音乐列表歌曲播放
    void slot_itemDoubleClicked(QListWidgetItem *item);
private:
    bool isMusicSendThreadActive = false;
};
#endif // MUSICWIDGET_H
